/*
    日志器封装
      1. 头文件重包
      2. 头文件包含
      3. 命令空间
      4. 全局日志器
      5. 日志器结构
      6. 日志器初始化接口
      7. 日志器宏
*/


#pragma once

#include <iostream>
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include<spdlog/async.h>


namespace lyhlog{

    struct log_settings{
        bool async;  // enable async logging
        int level; // 1. debug 2. info 3. warn 4. error 
        std::string pattern;  //3. declare pattern   
        std::string path;  //4. declare path
    };
    // declare logger
    extern std::shared_ptr<spdlog::logger> g_logger;
    // declare log settings
    extern void log_init(const log_settings& settings);

    // declare log macros
    #define FMT_PREFIX std::string("[{}:{}][{}]")
    #define DEBUG(fmt, ...) lyhlog::g_logger->debug(FMT_PREFIX +fmt, __FILE__, __LINE__, __FUNCTION__ ,##__VA_ARGS__)
    #define INFO(fmt, ...) lyhlog::g_logger->info(FMT_PREFIX+fmt, __FILE__, __LINE__, __FUNCTION__ ,##__VA_ARGS__)
    #define WARN(fmt, ...) lyhlog::g_logger->warn(FMT_PREFIX+fmt, __FILE__, __LINE__, __FUNCTION__ ,##__VA_ARGS__)
    #define ERROR(fmt, ...) lyhlog::g_logger->error(FMT_PREFIX+fmt, __FILE__, __LINE__, __FUNCTION__ ,##__VA_ARGS__)

}